#include "Pieza.h"

Pieza::Pieza(){
	this->forma=NULL;
	this->cantidadColumnas=0;
	this->cantidadFilas=0;
}

Pieza::Pieza(Pieza &piezaOriginal){
	this->cantidadColumnas=piezaOriginal.cantidadColumnas;
	this->cantidadFilas=piezaOriginal.cantidadFilas;
	this->setForma(piezaOriginal.forma,piezaOriginal.cantidadColumnas,piezaOriginal.cantidadFilas);
}

Pieza::~Pieza() {
	if (this->forma!=NULL){
		for(unsigned int i=0;i<this->cantidadColumnas;i++){
			delete[] forma[i];
		}
	delete[] forma;
	}
}

void Pieza::setForma(Casillero** formaDeLaPieza,unsigned int cantidadDeColumnas,unsigned int cantidadDeFilas){

	if ((formaDeLaPieza!=NULL)&&(cantidadDeColumnas!=0)&&(cantidadDeFilas!=0)){		//si las dimensiones son validas y el puntero no es null, copiar las cosas
		this->cantidadColumnas=cantidadDeColumnas;
		this->cantidadFilas=cantidadDeFilas;
		this->forma= new Casillero*[cantidadDeColumnas];
		for(unsigned int i=0;i<cantidadDeColumnas;i++){
			forma[i]= new Casillero[cantidadDeFilas];
			for(unsigned int j=0;j<cantidadDeFilas;j++){
				if(formaDeLaPieza[i][j].getEstado()){
					forma[i][j].llenarCasillero(formaDeLaPieza[i][j].getColor()); //copia cada casillero individualmente
				}
			}
		}
	}
}

Casillero Pieza::getCasillero(int posicionX,int posicionY){
	Casillero casilleroVacio;
	if (this->forma!=NULL) return forma[posicionX][posicionY]; else return casilleroVacio;
}

void Pieza::espejar(bool espejadoHorizontal){

	Casillero** nuevaForma;
	if (this->forma==NULL) return; //previene el espejado de una pieza vacia
	nuevaForma=new Casillero*[this->cantidadColumnas];// crea la nueva matriz de casilleros que reemplazara a la anterior
	for (unsigned int i=0;i<this->cantidadColumnas;i++){
		nuevaForma[i]= new Casillero[this->cantidadFilas];

	}
	for (unsigned int i=0;i<this->cantidadColumnas;i++){
		for (unsigned int j=0;j<this->cantidadFilas;j++){
			nuevaForma[i][j]=this->forma[this->cantidadColumnas - 1 - i][j];
		}
	}
	for (unsigned int i=0;i<this->cantidadColumnas;i++){
		delete[] this->forma[i];
	}
	delete[] this->forma;
	this->forma = nuevaForma;
}

void Pieza::rotar(){
	Casillero** nuevaForma;
	unsigned int variableAuxiliarDeIntercambio;
	if (this->forma==NULL) return;
	nuevaForma=new Casillero*[this->cantidadFilas];// crea la nueva matriz de casilleros que reemplazara a la anterior, pero con filas y columnas intercambiadas
	for (unsigned int i=0;i<this->cantidadFilas;i++){
		nuevaForma[i]= new Casillero[this->cantidadColumnas];

	}
	for (unsigned int i=0;i<this->cantidadColumnas;i++){
		for (unsigned int j=0;j<this->cantidadFilas;j++){
			nuevaForma[j][i]=this->forma[i][j];		//traspone la matriz
		}
	}

	for (unsigned int i=0;i<this->cantidadColumnas;i++){
		delete[] this->forma[i];
	}
	delete[] this->forma;
	this->forma=nuevaForma;
	variableAuxiliarDeIntercambio=this->cantidadColumnas;
	this->cantidadColumnas=this->cantidadFilas;
	this->cantidadFilas=variableAuxiliarDeIntercambio;

	this->espejar(true);
}

unsigned int Pieza::getCantidadColumnas(){
	return this->cantidadColumnas;
}
unsigned int Pieza::getCantidadFilas(){
	return this->cantidadFilas;
}

void Pieza::mostrarPorConsola(){
	if (this->forma==NULL){
		cout << "pieza vacia!!";
		return;
	}
	for(unsigned int j=0;j<this->cantidadFilas;j++){
		for (unsigned int i=0;i<this->cantidadColumnas;i++){
			if(this->forma[i][j].getEstado()){
				cout << "X";
			}
			else{
				cout << "_";
			}

		}
		cout << endl;
	}
}
